package org.example.informacionestudiante.impl;

import java.math.BigInteger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.ws.Endpoint;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.soap.Addressing;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.example.informacionestudiante.*;

//import client.CallBackDinamic;

import javax.annotation.Resource;
import javax.jws.HandlerChain;
import javax.jws.WebService;

@WebService(serviceName = "InformacionEstudiante", endpointInterface = "org.example.informacionestudiante.InformacionEstudiante", targetNamespace = "http://www.example.org/InformacionEstudiante/")
@Addressing(enabled=true, required=true)
@HandlerChain(file = "serverchain.xml")
public class InformacionEstudianteImpl implements InformacionEstudiante {
	
	
	@Resource
	private WebServiceContext context;
	
	
	public org.example.schemaestudiante.Est obtenerInfoEstudiante(
			org.example.schemaestudiante.Doc documento) {
		
		org.example.schemaestudiante.Est estudiante = null;
		
		NodeList nodes = null;
		try {
			
        	System.out.println("Comienzo de la invocacion -----------------");
			org.example.schemaestudiante.TipoDoc tipo = documento.getTipo();
			org.example.schemaestudiante.PaisDoc pais = documento.getPais();
			BigInteger numero = documento.getNumero();
			
	        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
	        domFactory.setNamespaceAware(true);
        
            DocumentBuilder builder = domFactory.newDocumentBuilder();
       //     Document dDoc = builder.parse("D:/workspace/ejercicio3/src/org/example/informacionestudiante/impl/estudiantes.xml");
            Document dDoc = builder.parse("C:/DatosXML/estudiantes.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            nodes = (NodeList) xPath.evaluate("/estudiantes/estudiante[documento/numero="+numero.toString()+" and documento/pais='"+pais.toString()+"' and documento/tipo='"+tipo.toString()+"']", dDoc, XPathConstants.NODESET);
            System.out.println("/estudiantes/estudiante[documento/numero="+numero.toString()+" and documento/pais='"+pais.toString()+"' and documento/tipo='"+tipo.toString()+"']");
            System.out.println("Estudiantes encontrados: "+nodes.getLength());

            if (nodes.getLength() == 1) {
            	Element est = (Element) nodes.item(0);
            	estudiante = new org.example.schemaestudiante.Est();

            	estudiante.setDocumento(documento);
            	estudiante.setNombres(xPath.evaluate("./nombres", est));
            	estudiante.setApellidos(xPath.evaluate("./apellidos", est));
            	
            	MessageContext messageContext = context.getMessageContext();
            	System.out.println("Received message ID: " + messageContext.get("MessageID"));
            	System.out.println("Reply To address: " + messageContext.get("ReplyTo"));
            	System.out.println("Fin de la invocacion -----------------");
            	
           	
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
		return estudiante;
	}
}